var express = require('express');

// 引入检查token中间件
const checkTokenMiddleware = require('../../middlewares/checkTokenMiddleware')
// 引入moment
const moment = require('moment');
var router = express.Router();
const AccountModel = require('../../models/AccountModel');

// 记账本上的列表
router.get('/account', checkTokenMiddleware, function(req, res, next) {
  console.log(req.user) // 获取jwt中存放的用户信息，用于查询该用户下的数据
  AccountModel.find().sort({time: -1}).exec((err, data) => {
    if (err) {
      res.json({
        code: '1001',
        msg: '查询失败~',
        data: null,
      })
      return
    }
    res.json({
      code: '0000',
      msg: '查询成功~',
      data: data,
    })
  })
});

// 新增记录
router.post('/account', checkTokenMiddleware, function(req, res, next) {
  // 表单验证
  if (!req.body.title) {
    res.json({
      code: '1003',
      msg: '标题不能为空！',
      data: null,
    })
    return
  } else if (!(req.body.type === -1 || req.body.type === 1)) {
    res.json({
      code: '1004',
      msg: '类型只能为1或-1（1为收入，-1为支出）',
      data: null,
    })
    return
  } else if (!(typeof req.body.account === 'number' && req.body.account >= 0)) {
    res.json({
      code: '1005',
      msg: '金额只能为数字，且大于等于0',
      data: null,
    })
    return
  }

  // 插入数据库
  const time = moment(req.body.time).toDate()
  AccountModel.create({
    ...req.body,
    time,
  }, (err, data) => {
    if (err) {
      res.json({
        code: '1002',
        msg: '添加失败~',
        data: null,
      })
      return
    }
    res.json({
      code: '0000',
      msg: '添加成功~',
      data: data,
    })
  })
});

// 删除记录
router.delete('/account/:id', checkTokenMiddleware, function(req, res, next) {
  const id = req.params.id
  AccountModel.deleteOne({_id: id}, (err, data) => {
    if (err) {
      res.json({
        code: '1006',
        msg: '删除失败~',
        data: null,
      })
      return
    }
    res.json({
      code: '0000',
      msg: '删除成功~',
      data: {},
    })
  })
});

// 获取单条记录
router.get('/account/:id', checkTokenMiddleware, function(req, res, next) {
  const id = req.params.id
  AccountModel.findById(id, (err, data) => {
    if (err) {
      res.json({
        code: '1007',
        msg: '查询失败~',
        data: null,
      })
      return
    }
    res.json({
      code: '0000',
      msg: '查询成功~',
      data: data,
    })
  })
});

// 更新单个账单
router.patch('/account/:id', checkTokenMiddleware, function(req, res, next) {
  const id = req.params.id
  // updateOne：与update（）相同，只是MongoDB将只更新第一个符合条件的文档，而不考虑多选的值。
  // replaceOne()：与update（）相同，只是MongoDB用给定的文档替换现有文档（没有像$set这样的原子运算符）。
  AccountModel.updateOne({_id: id}, req.body, (err, data) => {
    if (err) {
      res.json({
        code: '1008',
        msg: '更新失败~',
        data: null,
      })
      return
    }
    AccountModel.findById(id, (err, data) => {
      if (err) {
        res.json({
          code: '1007',
          msg: '查询失败~',
          data: null,
        })
        return
      }
      res.json({
        code: '0000',
        msg: '更新成功~',
        data: data,
      })
    })
  })
})

module.exports = router;
